iT邦幫忙

2023 iThome 鐵人賽

0
Software Development

救救我啊我救我!CRUD 工程師的惡補日記系列 第 41

【MySQL】資料的增刪改查與條件撰寫

  • 分享至 

  • xImage
  •  

上一篇設計好資料表,並建立出來後,就能在裡面添加資料了。本文整理出資料的新增、查詢、更新與刪除語法,以及查詢條件的撰寫方式。


一、新增資料

首先認識一下員工資料表的設計。

CREATE TABLE `employee` (
    `emp_id` INT UNSIGNED AUTO_INCREMENT,
    `name` NVARCHAR(50) NOT NULL,
    `email` VARCHAR(50) NOT NULL UNIQUE,
    `on_board_date` DATE NOT NULL DEFAULT("1970-01-01"),
    `gender` CHAR(1) NOT NULL CHECK(`gender` IN ("M", "F")),
    `salary` INT UNSIGNED NOT NULL CHECK(`salary` >= 27000),
    `dept_id` INT UNSIGNED,
    PRIMARY KEY(`emp_id`)
);

以下指令是新增一筆資料。

INSERT INTO `employee`(`name`, `email`, `on_board_date`, `gender`, `salary`, `dept_id`)
VALUE("Vincent", "vincent@yahoo.com.tw", "2018-01-01", "M", 32000, 1);

若要新增多筆資料,將 VALUE 改為 VALUES,資料之間欄位值以逗點隔開即可。其實不論幾筆資料,統一用 VALUES 也是好選擇。

INSERT INTO `employee`(`name`, `email`, `on_board_date`, `gender`, `salary`, `dept_id`)
VALUES
("Ivy", "ivy@gmail.com", "2020-01-01", "F", 38000, 2),
("Roger", "roger@gmail.com", "2019-01-01", "M", 41000, null),
("Dora", "dora@gmail.com", "2021-01-01", "F", 38000, 2);

二、查詢資料

(一)一般查詢

上面簡單新增了幾筆資料,而以下的指令是查詢出表中的所有資料。

SELECT * FROM `employee`;

以下是查看特定的欄位,將 * 改為 欄位名稱即可。

SELECT `name`, `salary` FROM `employee`;

以下是查詢欄位為特定值的資料,例如「emp_id」欄位為 1。加上條件時,會使用 WHERE 語法。

SELECT *
FROM `employee`
WHERE `emp_id` = 1;

(二)去除重複查詢

假設目前資料表的現有資料節錄如下。
||emp_id||name||salary||dept_id||
|-|-|-|-|
|1|Vincent|32000|1|
|2|Ivy|38000|2|
|3|Roger|41000|null|
|4|Dora|38000|2|

以下是找出有薪水不到 40000 的員工的部門編號。若不希望查詢結果中,出現重複的資料,則需使用 DISTINCT 語法。

SELECT DISTINCT `dept_id`
FROM `employee`
WHERE `salary` < 40000;

透過 DISTINCT,會讓原本內容為 1、2、2 共三筆的查詢結果,變成 1、2 兩筆,達到去除重複。

我們也可針對多個欄位,比方說想要知道每個部門中,是哪些薪水金額不到 40000。

SELECT DISTINCT `dept_id`, `salary`
FROM `employee`
WHERE `salary` < 40000;

只有當欄位值全部相同,才視為重複。以上的查詢結果有兩筆:「1 號部門 32000 元」、「2 號部門 38000 元」。

二、更新與刪除資料

(一)安全模式

讀者首先要知道,在更新或刪除時,若未加上條件,代表要作用於表中的所有資料。MySQL 為了保護我們不要誤刪、誤改全部資料,其「安全模式」會禁止該操作。

執行以下指令,分別可關閉、開啟安全模式。

-- 關閉
SET SQL_SAFE_UPDATES = 0;

-- 開啟
SET SQL_SAFE_UPDATES = 1;

(二)更新

以下指令是將所有資料的「salary」欄位都增加 2000。

UPDATE `employee`
SET `salary` = `salary` + 2000;

以下指令是將薪資未達 30000 的員工,加至該金額,並設定為 0 號部門。

UPDATE `employee`
SET `salary` = 30000,
    `dept_id` = 0
WHERE `salary` < 30000;

(三)刪除

以下是刪除「emp_id」欄位為 4 的員工。

DELETE FROM `employee`
WHERE `emp_id` = 4;

三、撰寫查詢條件

(一)比較運算子

比較運算子包含 ><=>=<=!=,相當直覺,筆者就不贅述。

以下條件是查詢薪資未達 40000 的員工。

SELECT *
FROM `employee`
WHERE `salary` < 40000;

以下條件是查詢 2019 年起入職的員工。雖然欄位是是日期型態,但只要以「YYYY-MM-DD」的格式撰寫字串即可。

SELECT *
FROM `employee`
WHERE `on_board_date` >= "2019-01-01";

以下條件是查詢女性員工。

SELECT *
FROM `employee`
WHERE `gender` = "F";

(二)邏輯運算子

邏輯運算子包含 ANDORNOT,也很直覺。

以下條件是查詢 2020 年以前入職,而薪資未達 40000 的員工。

SELECT *
FROM `employee`
WHERE `on_board_date` < "2020-01-01" AND `salary` < 40000;

若要以數值或日期的範圍作為條件,可用 BETWEEN ... AND ... 語法。以下條件是查詢未在 2018 到 2019 年入職的員工。

SELECT *
FROM `employee`
WHERE NOT (`on_board_date` BETWEEN "2018-01-01" AND "2019-12-31");

當包含的條件太多,為了避免混亂,可用括弧包起來。

(三)格式匹配

這種條件是以欄位值是否符合特定格式,來進行查詢。

會使用兩個萬用字元。% 代表 0 到多個字;_ 代表 1 個字。

以下條件是查詢使用 Yahoo 信箱的員工。

SELECT *
FROM `employee`
WHERE `email` LIKE "_%@yahoo.com%";

其中 _% 組合出 1 到多個字的效果。

(四)多個指定值

如果查詢條件是多個指定的值,雖然用 OR 運算子串接起來也行,但不易閱讀。可改用 IN 語法。

以下條件是查詢 1、2 號部門的員工。

SELECT *
FROM `employee`
WHERE `dept_id` IN (1, 2);

(五)空值

當欄位沒有值,也就是 null,則那些資料並不會參與需要用到該欄位的查詢。

以下條件是查詢沒有部門編號的員工。

SELECT *
FROM `employee`
WHERE `dept_id` IS NULL;

今日文章到此結束!
最後宣傳一下自己的部落格,我是「新手工程師的程式教室」的作者,主要發表後端相關文章,請多指教/images/emoticon/emoticon41.gif


上一篇
【MySQL】資料表、資料型態與欄位限制
下一篇
【MySQL】排序與分頁
系列文
救救我啊我救我!CRUD 工程師的惡補日記50
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言